/*
 * @lc app=leetcode.cn id=15 lang=javascript
 *
 * [15] 三数之和
 */

// @lc code=start
/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function (nums) {
  let res = [];
  nums.sort((a, b) => a - b);
  let resStr = new Set();
  for (let i = 1; i < nums.length - 1; i++) {
    let left = i - 1;
    let right = i + 1;
    let item = nums[i];
    while (left >= 0 && right <= nums.length - 1) {
      if (nums[left] + nums[right] + item < 0) {
        right++;
      } else if (nums[left] + nums[right] + item > 0) {
        left--;
      } else {
        if (!resStr.has("" + nums[left] + item+nums[right])) {
            resStr.add("" + nums[left] + item+nums[right])
          res.push([nums[left], item, nums[right]]);
        }
        left--;
        right++;
      }
    }
  }
  return res;
};
// @lc code=end
// var threeSum = function (nums) {
//   let result = [];
//   let map = new Set();
//   function twoAdd(SubNums, target) {
//     let hash = new Set();
//     SubNums = [...new Set(SubNums)];
//     for (let i = 0; i < SubNums.length; i++) {
//       let item = SubNums[i];
//       if (hash.has(target - item) && !map.has(item)) {
//         result.push([-target, item, target - item]);
//       } else {
//         hash.add(item);
//       }
//     }
//   }
//   for (let i = 0; i < nums.length; i++) {
//     let NewNums = nums.slice(i + 1, nums.length);
//     twoAdd(NewNums, -nums[i]);
//     map.add(nums[i]);
//   }
//   return result;
// }; 错误的思路，单纯以为双数之和再加一轮遍历
threeSum([-1, 0, 1, 2, -1, -4]);
